package com.wx.generic.pecs;

import com.wx.thread.Person;

import java.util.ArrayList;

public class PECS {
    /**
     *
     * https://www.zhihu.com/question/20400700/answer/117464182
     * ? super Fruit
     *
     * 不是说 只接受Fruit和Fruit的父类， 而是说这个类型T可能是Fruit及其父类，
     * Apple肯定属于T,所以能放进去。
     *
     * ? extends Fruit，
     * 这个类型是 Fruit Apple 的基类，所以可以取 直接向上转型成Fruit就可以了，但是不知道具体的类型是什么
     * 还可能是香蕉 橘子 菠萝，所以没有办法判断到底是什么，就直接不让它去进行存储了
     *
     * 是说类型T可能是 Fruit及其子类，意味着T可能是苹果，也可能是红富士苹果。
     * 当T为红富士时，放一个苹果进去肯定不对，会报错，因为这个苹果不一定是红富士。
     * 容器是生产者，那么就需要不断的提供东西，所以 ？ extends Fruit 上界
     * 容器是消费者，那么就需要不断的往容器中插入数据 所以 ？ super Fruit 下界
     */

    ArrayList<? extends Fruit> exdentFurit;
    ArrayList<? super Fruit> superFurit;
    Apple apple = new Apple();
    Person person = new Person();
    private void test() {
        Fruit a1 = exdentFurit.get(0);
        // Fruit a2 = superFurit.get(0); //Err1 因为存储的是Fruit或者Fruit的父类，在取得时候没有办法判断

        //exdentFurit.add(apple); //Err2
        superFurit.add(apple); // 可以向上转型

    }
}